home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 261_01 / asinit.c < prev    next >
Text File  |  1988-02-23  |  10KB  |  337 lines

  1. /*    asinit.c, the source of a 68000 assembler.... initialization
  2.  *    (C) Copyright 1982 Steve Passe
  3.  *    All Rights Reserved
  4.  *
  5.  *  ver. 1.00
  6.  * created 10/7/82
  7.  *
  8.  * version 1.01
  9.  *
  10.  *    8/30/83 ver. 1.01 modified for Aztec ver. 1.05g smp
  11.  *    12/23/83    fixed 24 bit address bug in flush_rcrd smp
  12.  *    12/24/83    fixed lowercase    a-f in S-records smp
  13.  *    10/09/87    split from as68.c for overlay on PDP-11
  14.  */
  15.  
  16. /* begincode */
  17.  
  18. /* includes */
  19.  
  20. #include <stdio.h>
  21. #include "as68.h"
  22.  
  23. /* externals */
  24.  
  25. extern struct _symbol *symtbl;
  26. extern struct _symbol *syms_head;    /* head of sym table free space */
  27. extern char *syms_tail;            /* tail of sym table free space */
  28. extern int symspace;            /* bytes in symbol table */
  29. extern int symbols;            /* number of symbols in table */
  30.  
  31. extern FLAG fatal;
  32. extern char pass;            /* present pass number, 1 or 2 */
  33. extern unsigned line_count;        /* line number of source file */
  34. extern unsigned list_count;        /* line # of list file */
  35. extern long loc_counter;        /* address to assemble obj code */
  36. extern int loc_plus;            /* increment to loc counter    */
  37. extern char lcksm;        /* bytes + addr. + count + lcksm == 0xff */
  38. extern FLAG abs_long;            /* default to absolute long add.*/
  39. extern FLAG rorg;            /* prog. counter relative flag */
  40. extern FLAG do_label;            /* process label if set */
  41. extern char statement[STMNT_SIZE];    /* statement line buffer */
  42. extern char label[32];            /* bufr for label from preparse */
  43. extern char instr[32];            /* bufr for mnem, psdo or macro */
  44. extern char *opfld_ptr;            /* pointer to operand field */
  45. extern int wrap;            /* wrap column for list output */
  46. extern FLAG trunc;            /* truncate lines in listing */
  47. extern char source_name[FNAME_SIZE];    /* source file name */
  48. extern int src_level;            /* source file level */
  49. extern FILE *_src[SRCLEVELS];        /* source file descripters */
  50. extern FLAG objchnl;            /* Motorola S ('s') or nil ('x') */
  51. extern FLAG obj_open;            /* object channel open flag */
  52. extern char of_disk;            /* default object file drive */
  53. extern char object_name[FNAME_SIZE];    /* object file name */
  54. extern FILE *obj_f;            /* object file descripter */
  55. extern FLAG lstchnl;            /* list channel(s) open */
  56. extern FLAG nolist;            /* flag for list/nolist pseudos */
  57. extern FLAG lcon;            /* list to console flag */
  58. extern FLAG llst;            /* list to list device flag */
  59. extern FLAG lfile;            /* list to file flag */
  60. extern FLAG lfile_open;           /* list file open flag */
  61. extern char lf_disk;            /* default list file drive */
  62. extern char list_name[FNAME_SIZE];    /* listing file name */
  63. extern FILE *lst_f, *lst_d;        /* listing file & dev descripter */
  64. extern FLAG errchnl;            /* error channel(s) open */
  65. extern FLAG econ;            /* errors to console flag */
  66. extern FLAG elst;            /* errors to list device flag */
  67. extern FLAG elfile;            /* errors to listing file */
  68. extern FLAG efile;            /* errors to error file */
  69. extern FLAG efile_open;           /* error file open flag */
  70. extern char ef_disk;            /* default error file drive */
  71. extern char error_name[FNAME_SIZE];    /* error file name */
  72. extern FILE *err_f;            /* error file descripter */
  73. extern struct _oprnd op1, op2;        /* structs to hold operand val */
  74.  
  75. extern char code[12];            /* 12 minimum for overflow */
  76. extern char buf[85];
  77.  
  78. extern long lex_val;
  79. extern char *p;
  80.  
  81. extern struct _mtable mtable[];
  82.  
  83. /* types */
  84.  
  85. char *nextfield();
  86. long dtol();
  87. char * cisat();
  88.  
  89. /* beginmain */
  90.  
  91. asinit(argc, argv)
  92. int argc;
  93. char *argv[];
  94. {
  95.     register int x, y;
  96.     char *c_ptr;            /* scratch pointer to char */
  97.     char _ext[5];            /* scratch ext buffer */
  98.  
  99.     puts("\nAS68, ver 1.01, 68000 assembler, (C) Copyright 1982 Steve Passe\n");
  100.  
  101. /** parse the command line, setting variables as needed */
  102.  
  103.     if (argc < 2) {
  104.     puts("\n...source file?");
  105.     exit(0);
  106.     }
  107. /** set flag variables according to command line args */
  108.  
  109.     for (x = 2; x < argc; ++x) {
  110.     switch (tolower(argv[x][0])) {
  111.     case 'e':                    /* error file opt */
  112.         econ = NO;
  113.         for (y = 1; argv[x][y]; ++y) {
  114.         switch (tolower(argv[x][y])) {
  115.         case 'c':   econ = YES;     continue;
  116.         case 'l':   elst = YES;     continue;
  117.         case 'f':   elfile = YES;   continue;
  118.         case 'e':   efile = YES;
  119.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  120.             ef_disk    = argv[x][++y];
  121.             ++y;
  122.             }
  123.             continue;
  124.         default:    errchnl = NO;
  125.         }
  126.         }
  127.         continue;
  128.     case 'l':                    /* list file opt */
  129.         lstchnl = YES;
  130.         for (y = 1; argv[x][y]; ++y) {
  131.         switch (tolower(argv[x][y])) {
  132.         case 'c':   lcon = YES;     continue;
  133.         case 'l':   llst = YES;     continue;
  134.         case 'f':   lfile = YES;
  135.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  136.             lf_disk    = argv[x][++y];
  137.             ++y;
  138.             }
  139.             continue;
  140.         default:    lstchnl = NO;
  141.         }
  142.         }
  143.         continue;
  144.     case 'o':                    /* object file opt */
  145.         for (y = 1; argv[x][y]; ++y) {
  146.         switch (tolower(argv[x][y])) {
  147.         case 's':   objchnl = 's';
  148.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  149.             of_disk    = argv[x][++y];
  150.             ++y;
  151.             }
  152.             continue;
  153.         default:    objchnl = 'x';
  154.         }
  155.         }
  156.         continue;
  157.     case 's':
  158.         opfld_ptr = &argv[x][1];
  159.         symspace = (int) dtol();
  160.         continue;
  161.     case 'w':
  162.         wrap = atoi(&argv[x][1]);
  163.         if (wrap < 60) wrap = 60;
  164.         continue;
  165.     case 't':
  166.         trunc = YES;
  167.         continue;
  168.     default:    puts("\nhuh?"); exit(0);
  169.     }
  170.     }
  171.  
  172.     /* allocate space for symbol table */ 
  173.     if (!(symtbl = (struct _symbol *) malloc(symspace))) {
  174.     printf("\n...symbol table too large (%d)", symspace);
  175.     exit(0);
  176.     }
  177.     syms_head = symtbl + 1;             /* init free space head */
  178.     syms_tail = (char *) symtbl;
  179.     syms_tail += symspace;            /* init free space tail */
  180.  
  181.     symtbl[0]._sym = "";            /* dummy entry */
  182.     symtbl[0]._val = NULL;
  183.     symtbl[0]._atr = NULL;
  184.  
  185. /* initialize sourcename, errname, listname, and objname */
  186.  
  187.     if (too_long(argv[1], 14)) {
  188.     exit(0);
  189.     }
  190.     if (argv[1][1] == ':') {            /* a disk identifier exists */
  191.     strcpy(source_name, argv[1]);            /* get source file name */
  192.     }
  193.     else {                      /* default to logged in disk */
  194.     if (too_long(argv[1], 12)) {
  195.         exit(0);
  196.     }
  197. #ifdef CPM
  198.     source_name[0] = bdos(CURR_DISK, 0) + 'A';    /* read default    disk */
  199.     source_name[1] = ':';               /* separator */
  200.     source_name[2] = '\0';              /* make a string */
  201. #endif /*CPM*/
  202.     strcat(source_name, argv[1]);            /* add the name */
  203.     }
  204.     if (c_ptr = cisat('.', source_name)) {      /* if extension    */
  205.     word_copy(_ext,    4, c_ptr);            /* save ext */
  206.     *c_ptr = '\0';                  /* erase it */
  207.     }
  208.     else strcpy(_ext, ".sa");            /* default extension */
  209.     if (too_long(source_name, 10)) {
  210.     exit(0);
  211.     }
  212.     strcpy(object_name,    source_name);        /* make object file name */
  213.     switch (objchnl) {
  214.     case 'x':   break;                    /* none wanted */
  215.     case 's':   strcat(object_name, ".mx");    /* for Motorola    S FILE */
  216.         break;
  217.     default:    printf("\n...bad object file type ('%c')", objchnl);
  218.     }
  219.     if (of_disk) object_name[0]    = of_disk;    /* pick up option */
  220.     strcpy(list_name, source_name);
  221.     strcat(list_name, ".ls");            /* make list file name */
  222.     if (lf_disk) list_name[0] = lf_disk;    /* option */
  223.     strcpy(error_name, source_name);
  224.     strcat(error_name, ".err");            /* make error file name */
  225.     if (ef_disk) error_name[0] = ef_disk;    /* option */
  226.     strcat(source_name,    _ext);            /* add ext. */
  227.  
  228.     /* open appropriate    source,    list, error, and object files */
  229.  
  230.     if (!(_src[0] = fopen(source_name, "r"))) {
  231.     printf("\n...can't open source (\"%s\")", source_name);
  232.     exit(0);
  233.     }
  234.                     /* open list, err, and obj as needed */
  235.     if (objchnl    != 'x') {
  236.     if (!(obj_f = fopen(object_name, "w"))) {
  237.         printf("\n...can't open object (\"%s\")", object_name);
  238.         exit(0);
  239.     }
  240.     obj_open = TRUE;
  241.     obj_out(OPEN, 0, 0);
  242.     }
  243.     if (lfile) {
  244.     if (!(lst_f = fopen(list_name, "w"))) {
  245.         printf("\n...can't open list (\"%s\")", list_name);
  246.         exit(0);
  247.     }
  248.     lfile_open = TRUE;
  249.     }
  250.     if (efile) {
  251.     if (!(err_f = fopen(error_name,    "w"))) {
  252.         printf("\n...can't open error (\"%s\")", error_name);
  253.         exit(0